// ClientReceiver.cpp: implementation of the ClientReceiver class.
//
//////////////////////////////////////////////////////////////////////

#include "ClientReceiver.h"

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
ClientReceiver::ClientReceiver(MapObservers &map,CNode& node,std::string mutex,int clientNumber){
		this->mapObservers=map;
		this->node=node;
		this->mutex=mutex;
		this->clientNumber = clientNumber;
}
	
ClientReceiver::~ClientReceiver(){

}

void ClientReceiver::run(){
	try{
		while(node.isConnected()){
		//mientras no rompa el socket
			int enumerado,length;
			node.getInputStream().read(reinterpret_cast<char*>(&enumerado),sizeof(enumerado));
			node.getInputStream().read(reinterpret_cast<char*>(&length),sizeof(length));
			void* data = operator new(length);
			node.getInputStream().read(reinterpret_cast<char*>(data),length);
			cambiarCode(enumerado);
			//pedis un mutex para el map
			wait(this->mutex.c_str());
			MapObservers::iterator it = mapObservers.find(enumerado);
			if(it!=mapObservers.end()){
				//patetico no anda
				(it->second)->notify(data);
				delete data;
			} else {
				//no haces nada porque no tenes handler para el mensaje
				std::cout << "No hay handler para el mensaje";
				logger::getInstancia()->logServer("No hay handler para el mensaje");
			}
			//soltas el mutex
			release(this->mutex.c_str());
			sleep(30);
		}
	} catch(IOException* ex){
		std::cout << ex->what() << std::endl;
		delete ex;
		node.close();
	} catch(...){
		std::cout << "Mala onda. Roto Exception" << std::endl;
	}

}

void ClientReceiver::cambiarCode(int& enumerado){
	if (enumerado == ACTUALIZACION_PAD) {
		if(clientNumber == 1){
			enumerado = ACTUALIZACION_PAD_1;
		} else {
			enumerado = ACTUALIZACION_PAD_2;
		}
	}
}